package com.krtech.wecard.utils.sms;

import cn.dev33.satoken.SaManager;
import cn.hutool.core.util.StrUtil;
import com.krtech.wecard.framework.exception.BusinessException;
import com.krtech.wecard.utils.verify.VerifyCode;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;

/**
 * @Author Chen Kun
 * @Date 2021/3/31
 */
@Slf4j
public class SmsUtil {


//	public static void main(String[] args) {
//		String verification = RandomUtil.randomNumbers(6);
//
//		VerifyCode verifyCode = new VerifyCode();
//		verifyCode.setCode(verification);
//		//拼接验证码
//		String value = verifyCode + "_" + System.currentTimeMillis();
////		redisTemplate.opsForValue().set(cacheKey, value, CODE_EXPIRED * 60 * 1000, TimeUnit.MILLISECONDS);
//		verifyCode.setPhone("19981978107");
//		verifyCode.setTime(CODE_EXPIRED.toString());
//
//		sendSms(verifyCode);
//	}

	private static SmsUtil smsUtil;

	private SmsUtil() {
	}

	public static SmsUtil getInstance() {
		if (smsUtil == null) {
			smsUtil = new SmsUtil();
		}
		return smsUtil;
	}


	public static SendSmsResponse sendSms(VerifyCode verifyCode) throws TencentCloudSDKException {
		//快锐
//		Credential cred = new Credential("AKIDZuzKpnKmoaAakdqenfXJo5542lEShCbg", "3qMEq9D4eyMUKuDHtKZ9YkgXHm0xe35G");
		//SeeMax
		Credential cred = new Credential("AKIDsfKsJbrOkuvlRwwoWBe5LtFMJG4fCdu0", "ynT1U3ShuBjAPBWkpua6g4ED1fBaqzys");
		// 实例化一个 http 选项，可选，无特殊需求时可以跳过
		HttpProfile httpProfile = new HttpProfile();
		/* SDK 默认使用 POST 方法。
		 * 如需使用 GET 方法，可以在此处设置，但 GET 方法无法处理较大的请求 */
		httpProfile.setReqMethod("POST");
		/* SDK 有默认的超时时间，非必要请不要进行调整
		 * 如有需要请在代码中查阅以获取最新的默认值 */
		httpProfile.setConnTimeout(60);
		ClientProfile clientProfile = new ClientProfile();
		/* SDK 默认用 TC3-HMAC-SHA256 进行签名
		 * 非必要请不要修改该字段 */
		clientProfile.setSignMethod("HmacSHA256");
		clientProfile.setHttpProfile(httpProfile);
		/* 实例化 SMS 的 client 对象
		 * 第二个参数是地域信息，可以直接填写字符串 ap-guangzhou，或者引用预设的常量 */
		SmsClient client = new SmsClient(cred, "", clientProfile);
		/* 实例化一个请求对象，根据调用的接口和实际情况，可以进一步设置请求参数
		 * 您可以直接查询 SDK 源码确定接口有哪些属性可以设置
		 * 属性可能是基本类型，也可能引用了另一个数据结构
		 * 推荐使用 IDE 进行开发，可以方便地跳转查阅各个接口和数据结构的文档说明 */
		SendSmsRequest req = new SendSmsRequest();
		//快锐
//		String appid = "1400348207";
		//seeMax
		String appid = "1400774689";
		req.setSmsSdkAppid(appid);
		/* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，可登录 [短信控制台] 查看签名信息 */
		String sign = verifyCode.getSign();
		//快锐
//		req.setSign(StringUtils.isNotBlank(verifyCode.getSign()) ? verifyCode.getSign() : "快锐科技");
		//seeMax
		req.setSign(StringUtils.isNotBlank(verifyCode.getSign()) ? verifyCode.getSign() : "四川喜麦文化传媒有限公司");
		// 模板 ID: 必须填写已审核通过的模板 ID，可登录 [短信控制台] 查看模板 ID 快锐模版id ：573901
//		req.setTemplateID(StringUtils.isNotBlank(verifyCode.getTemplateId()) ? verifyCode.getTemplateId() : "573901");//573901
		//快锐
		req.setTemplateID(StringUtils.isNotBlank(verifyCode.getTemplateId()) ? verifyCode.getTemplateId() : "1676648");//573901
		String[] phoneNumbers = {verifyCode.getPhone().startsWith("+") ? verifyCode.getPhone() : "+86" + verifyCode.getPhone()};
		req.setPhoneNumberSet(phoneNumbers);
		/* 模板参数: 若无模板参数，则设置为空*/
		String[] templateParams = {verifyCode.getCode(), verifyCode.getTime()};
		req.setTemplateParamSet(templateParams);
		/* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
		 * 返回的 res 是一个 SendSmsResponse 类的实例，与请求对象对应 */
		SendSmsResponse res = null;
		res = client.SendSms(req);
		// 输出 JSON 格式的字符串回包
		System.out.println(SendSmsResponse.toJsonString(res));
		// 可以取出单个值，您可以通过官网接口文档或跳转到 response 对象的定义处查看返回字段的定义
		System.out.println(res.getRequestId());
		return res;
	}

	/**
	 * 判断验证码是否正确
	 *
	 * @param phone
	 * @param verification
	 * @return
	 */
	public static boolean judgeVerificationCode(String phone, String verification) {

		//存入redis,并且限制过期时间，并且设置唯一键setNx，保证一个手机一分钟只能发送一次短信验证
		String currentVerification = SaManager.getSaTokenDao().get("getVerificationCode:"+phone);
		if (StrUtil.isEmpty(currentVerification)){
			throw new BusinessException("当前验证码已过期，请重新输入");
		}

		if (!verification.equals(currentVerification)){
			throw new BusinessException("您输入的验证码不正确，请重新输入");
		}

		return true;
	}

}
